package com.tedu.api.io;



import org.junit.Test;

import java.io.*;

/**
 * IO流--传对象--高级流
 * ObjectOutputStream  对象输出流---传Person.java对象---写操作
 * ObjectInputStream   对象输入流---传Person.java对象---读操作
 *
 */
public class ObjectIO {


   @Test
           public void testOOS() {

       FileOutputStream fos = null;
       ObjectOutputStream oos = null;
//1.创建Person对象
       try {
           Person p = new Person();
           p.setName("韩美娟");
           //数组--动态数组
           //   String str={"1","2","3"};   静态动态数组
           //   String[] str=new String[]{"1"};
           p.setSay(new String[]{"百因必有果，你的报应就是我~"});//动态数组传输方式
           System.out.println("打印对象:" + p);

           //对象输出流写出文件   xxx.obj   Person.java
           fos = new FileOutputStream("person.obj");
           oos = new ObjectOutputStream(fos);
           /**
            * writeObject(Object obj);   ---理解：写出对象
            * 该方法会将给定对象按照其结构进行转换
            * 转换为一组”组“字节，在通过其处理的流写出
            *
            * NotSerializableException 没有序列化异常
            * 原因：写出类没有实现序列化接口
            *
            * 写出文件专业术语
            * 1.通过对象输出流将Person类，先转换为一组”组“字节，这个过程【对象序列化】
            * 2.将序列化后的字节在通过字节流【低级流】写入文件中【硬盘上】做长久保存，这个过程【数据持久化】将person.obj持久化保存硬盘上
            */
           oos.writeObject(p);
           System.out.println("写出成功啦~~");
       } catch (FileNotFoundException e) {
           e.printStackTrace();
       } catch (IOException e) {
           e.printStackTrace();
       } finally {
           if (oos != null)
               try {
                   oos.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
       }
   }
        /**
         * ObjectInputStream   对象输入流
         * 序列化：将对象转换为二进制
         * 反序列化：二进制转换为对象
         * readObject（）返回读取的对象【？】
         * 需求：将序列化  person.obj文件  按照对象方式读入
         */


          @Test
          public void testOIS(){

            FileInputStream fis = null;
            ObjectInputStream ois = null;
            //创建低级流
            try {
                fis = new FileInputStream("person.obj");
                //创建高级流---对象读入
                ois = new ObjectInputStream(fis);
                //readObject() 获取对象【反序列化操作：二进制转换为对象】
                System.out.println(ois.readObject());
                System.out.println("反序列化成功！");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } finally {
                if (ois != null)
                    try {
                        ois.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
            }
        }
    }
